import { hasPermission, addVueCss, normalizeAuthConfig } from './index.js';
import { h, render } from 'vue';
/**
 * 权限指令
 * 
 * 
 * 输出函数：
 * hasPermission：判断是否有权限
 * 
 * 使用方法：
 * 写在vue的dom节点上 
 *   单个字符串方式： v-permission="'xxx'";
 *   多个字符串方式： v-permission="['aaa', 'bbb']";
 *   对象方式：  v-permission="{Object}}"
 *   code: [String | Array](必须) 权限代码
 *   logic: String code参数有多个的时候，判断方式。可选值（and | or），默认and
 *   noAccess：String  未授权处理方式:
 *     remove(default)：移除元素
 *     invalid: 设置为无效，禁止使用
 *     hide：隐藏
 *   class: noAccess为class时启用，没有权限时在节点上添加的class
 *   style: noAccess为style时启用，没有权限时在节点上添加的style
 */
function handlePermission(el, auth, vnode) {
  let config = normalizeAuthConfig(auth);

  if (hasPermission(config.code, config.logic, config.tip)) {
    return;
  }

  // 是否存在component 则替换组件
  if (config.component) {
    return replaceComponent(el, config.component);
  }

  let css = config.css;
  if (css.class || css.style) {
    addVueCss([vnode], css);
    return;
  }

  // 移除
  el.remove();
  const parent = el.parentNode;
  if (!parent) return;
  const anchor = new Comment('replaced');
  parent.replaceChild(anchor, el);

}

function replaceComponent(el, component){
  const parent = el.parentNode;
  if (!parent) return;
  // 创建新组件实例
  const newComponent = h(component);

  // 替换DOM元素
  const anchor = new Comment('replaced');
  parent.replaceChild(anchor, el);

  // 渲染新组件
  render(newComponent, parent, anchor);
}

export default {
  install(vue) {
    vue.directive('permission', {
      updated(el, binding, vnode){
        if (binding.oldValue == binding.value) return;
        try {
          handlePermission(el, binding.value, vnode);
        } catch (e) {
          console.warn(e, binding.value, binding.instance.$options.name, el);
        }
      },
      // 当被绑定的元素挂载到 DOM 中时
      mounted(el, binding, vnode) {
        
        try{
          handlePermission(el, binding.value, vnode);
        }catch(e){
          console.warn(e, binding.value, binding.instance.$options.name, el);
        }
      }
    });
  },
};

